package com.xufx.thread.liaoxuefeng.thread8_waitAndNotify;

import java.util.LinkedList;
import java.util.Queue;

/**
 * Created by xufx on 2021/12/30 12:42
 * 1. synchronized解决了多线程的竞争的问题，但是并没有解决多线程协调的问题
 * 2. 解决线程协调的方法之一可以使用wait-notify的方式。
 *      wait只能是锁对象上调用，wait方法执行时，将会释放锁。
 *      必须在sychronized中才能调用锁对象
 *      多线程协调的原则：当条件不满足时，线程进入等待状态；条件满足时，线程被唤醒，继续执行任务
 * 3.wait()方法必须在当前获取的锁对象上调用
 * 4.wait()方法返回时需要重新获得this锁
 * 5.wait()方法必须在synchronized内部使用
 */
public class Main {
}
/**
* 下面的代码实际上在while循环中永远不会退出。因为getTask()方法拿到了锁。一直都没有释放
*
*/
class TaskQueue{
    Queue<String> queue = new LinkedList<>();
    public synchronized void addTask(String s){
        // 改进前的增加任务的方法
        //this.queue.add(s);
        // 改进后的增加任务的方法
        this.queue.add(s);
        // 通知wait中的线程
        this.notify();
    }

    public synchronized  String getTask() throws InterruptedException {
        // 原来的获取task方法
//        while(queue.isEmpty()){
//            // do something
//        }
//        return queue.remove();
        // 改进的task方法
        while (queue.isEmpty()){
            // wait期间，线程会释放this锁
            this.wait();
        }
        return queue.remove();
    }
}
